home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / sun4.md / mach.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  8KB  |  267 lines

  1. /*
  2.  * mach.h --
  3.  *
  4.  *     Exported structures for the mach module.
  5.  *
  6.  * Copyright 1989 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  *
  15.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/mach/sun4.md/mach.h,v 9.15 92/08/10 17:58:49 mgbaker Exp $ SPRITE (Berkeley)
  16.  */
  17.  
  18. #ifndef _MACH
  19. #define _MACH
  20.  
  21. #ifdef KERNEL
  22. #include <machTypes.h>
  23. #include <user/setjmp.h>
  24. #else
  25. #include <kernel/machTypes.h>
  26. #include <setjmp.h>
  27. #endif
  28.  
  29. #ifdef lint
  30. #define    Mach_EnableIntr()
  31. #define    Mach_DisableIntr()
  32. #else
  33. /*
  34.  * Routines to enable and disable interrupts.  These leave unmaskable
  35.  * interrupts enabled.  These are assembly macros to be called from C code.
  36.  * They use the in-line capabilities of GCC.
  37.  */
  38. #define    Mach_EnableIntr()    {\
  39.     register unsigned int    tmpPsr;    \
  40.     asm volatile ( "mov    %%psr, %0;    \
  41.             andn    %0, 0xf00, %0;    \
  42.             mov    %0, %%psr; nop; nop; nop\n":    \
  43.             "=r"(tmpPsr));    \
  44.     }
  45.  
  46. #define    Mach_DisableIntr()    {\
  47.     register unsigned int tmpPsr;    \
  48.     asm volatile ( "mov    %%psr, %0;    \
  49.             or    %0, 0xf00, %0;    \
  50.             mov    %0, %%psr; nop; nop; nop\n":    \
  51.             "=r"(tmpPsr));    \
  52.     }
  53. #endif /* lint */
  54.  
  55.  
  56. #define DISABLE_INTR() \
  57.     if (!Mach_AtInterruptLevel()) { \
  58.     Mach_DisableIntr(); \
  59.     if (mach_NumDisableIntrsPtr[0] < 0) { \
  60.         panic("Negative interrupt count.\n"); \
  61.     } \
  62.     mach_NumDisableIntrsPtr[0]++; \
  63.     }
  64. #define ENABLE_INTR() \
  65.     if (!Mach_AtInterruptLevel()) { \
  66.     mach_NumDisableIntrsPtr[0]--; \
  67.     if (mach_NumDisableIntrsPtr[0] < 0) { \
  68.         panic("Negative interrupt count.\n"); \
  69.     } \
  70.     if (mach_NumDisableIntrsPtr[0] == 0) { \
  71.         Mach_EnableIntr(); \
  72.     } \
  73.     }
  74.  
  75. /*
  76.  * A macro to test if the current processor is at interrupt level.
  77.  */
  78.  
  79. #define    Mach_AtInterruptLevel()    (mach_AtInterruptLevel)
  80.  
  81. /*
  82.  * A macro to test if the current processor is in kernel mode.
  83.  */
  84.  
  85. #define    Mach_KernelMode()    (mach_KernelMode)
  86.  
  87. /*
  88.  * A macro to return the current interrupt nesting level.
  89.  */
  90.  
  91. #define    Mach_IntrNesting(cpu)    (mach_NumDisableIntrsPtr[(cpu)])
  92.  
  93. /*
  94.  * Delay for N microseconds.
  95.  */
  96. #ifdef sun4c
  97. extern unsigned int        machClockRate;
  98. #define    MACH_DELAY(n)    { \
  99.     register int N = (n) * machClockRate / 30 - 22; \
  100.     while (N > 0) { N--; } \
  101.     }
  102. #else
  103. #define    MACH_DELAY(n)    { register int N = (n)<<3; N--; while (N > 0) {N--;} }
  104. #endif
  105.  
  106. /*
  107.  * The interrupt register on a sun4.
  108.  */
  109. #ifdef sun4c
  110. extern unsigned char        *machInterruptReg;
  111. #define    Mach_InterruptReg    machInterruptReg
  112. #else
  113. #define    Mach_InterruptReg    ((unsigned char *) DEV_INTERRUPT_REG_ADDR)
  114. #endif
  115.  
  116. /*
  117.  * Suns don't have a write buffer, but this macro makes it easier to
  118.  * write machine-independent device drivers for both the Decstations and Suns.
  119.  */
  120. #define Mach_EmptyWriteBuffer()
  121.  
  122. #define Mach_SetErrno(err) Proc_GetActualProc()->unixErrno = (err)
  123.  
  124. /*
  125.  * Dispatch tables for kernel calls.
  126.  */
  127. extern ReturnStatus (*(mach_NormalHandlers[]))();
  128. extern ReturnStatus (*(mach_MigratedHandlers[]))();
  129.  
  130. /*
  131.  * Macro to get processor number
  132.  */
  133. #define    Mach_GetProcessorNumber()     0
  134.  
  135. /*
  136.  * Macro to get the user's stack pointer.
  137.  */
  138. #define Mach_UserStack() ((Address)machCurStatePtr->trapRegs->ins[6])
  139.  
  140. extern    Address    Mach_GetPC _ARGS_((void));
  141. extern    Address    Mach_GetCallerPC _ARGS_((void));
  142.  
  143. extern    Boolean    mach_KernelMode;
  144. extern    int    mach_NumProcessors;
  145. extern    Boolean    mach_AtInterruptLevel;
  146. extern    int    *mach_NumDisableIntrsPtr;
  147. /*
  148.  * mach_MachineType is a string used to expand $MACHINE in pathnames.
  149.  */
  150. extern    char    *mach_MachineType;
  151. /*
  152.  * mach_Format defines a byte ordering/structure alignment type
  153.  * used when servicing IOControls.  The input and output buffers for
  154.  * IOControls have to be made right by the server.
  155.  */
  156. extern    Fmt_Format    mach_Format;
  157.  
  158. /*
  159.  * Routine to initialize mach module.  Must be called first as part of boot
  160.  * sequence.
  161.  */
  162. extern void    Mach_Init _ARGS_((void));
  163.  
  164. /*
  165.  * Macro to put some primitive debugging values into a circular buffer.
  166.  * After each value, it stamps a special mark, which gets overwritten by the
  167.  * next value, so we always know where the end of the list is.
  168.  */
  169. extern    int    debugCounter;
  170. extern    int    debugSpace[];
  171. #define    MACH_DEBUG_ADD(thing)    \
  172.     debugSpace[debugCounter++] = (int)(thing);    \
  173.     if (debugCounter >= 500) {    \
  174.     debugCounter = 0;    \
  175.     }                \
  176.     debugSpace[debugCounter] = (int)(0x11100111);
  177.  
  178. /*
  179.  * Routines to munge machine state struct.
  180.  */
  181. #ifdef KERNEL
  182. #include <procMigrate.h>
  183. #else
  184. #include <kernel/procMigrate.h>
  185. #endif
  186.  
  187. extern void Mach_InitFirstProc _ARGS_((Proc_ControlBlock *procPtr));
  188. extern ReturnStatus Mach_SetupNewState _ARGS_((Proc_ControlBlock *procPtr, Mach_State *fromStatePtr, void (*startFunc)(), Address startPC, Boolean user));
  189. extern void Mach_SetReturnVal _ARGS_((Proc_ControlBlock *procPtr, int retVal,
  190.     int retVal2));
  191. extern void Mach_StartUserProc _ARGS_((Proc_ControlBlock *procPtr, Address entryPoint));
  192. extern void Mach_ExecUserProc _ARGS_((Proc_ControlBlock *procPtr, Address userStackPtr, Address entryPoint));
  193. extern void Mach_FreeState _ARGS_((Proc_ControlBlock *procPtr));
  194. extern void Mach_GetDebugState _ARGS_((Proc_ControlBlock *procPtr, Proc_DebugState *debugStatePtr));
  195. extern void Mach_SetDebugState _ARGS_((Proc_ControlBlock *procPtr, Proc_DebugState *debugStatePtr));
  196.  
  197. /*
  198.  * Migration routines.
  199.  */
  200. extern ReturnStatus Mach_EncapState _ARGS_((register Proc_ControlBlock *procPtr, int hostID, Proc_EncapInfo *infoPtr, Address buffer));
  201. extern ReturnStatus Mach_DeencapState _ARGS_((register Proc_ControlBlock *procPtr, Proc_EncapInfo *infoPtr, Address buffer));
  202. extern ReturnStatus Mach_GetEncapSize _ARGS_((Proc_ControlBlock *procPtr, int hostID, Proc_EncapInfo *infoPtr));
  203. extern Boolean Mach_CanMigrate _ARGS_((Proc_ControlBlock *procPtr));
  204. extern int Mach_GetLastSyscall _ARGS_((void));
  205.  
  206.  
  207. extern void Mach_SetHandler _ARGS_((int vectorNumber, int (*handler)(), ClientData clientData));
  208.  
  209. extern void Mach_InitSyscall _ARGS_((int callNum, int numArgs, ReturnStatus (*normalHandler)(), ReturnStatus (*migratedHandler)()));
  210.  
  211. extern ReturnStatus    Mach_Probe _ARGS_((int byteCount, Address readAddress, Address writeAddress));
  212.  
  213. /*
  214.  * Other routines.
  215.  */
  216. extern Mach_ProcessorStates Mach_ProcessorState _ARGS_((int processor));
  217. extern int Mach_GetNumProcessors _ARGS_((void));
  218. extern int Mach_GetBootArgs _ARGS_((int argc, int bufferSize, char **argv, char *buffer));
  219.  
  220.  
  221. /*
  222.  * Machine dependent routines.
  223.  */
  224. extern    Net_EtherAddress    *Mach_GetEtherAddress _ARGS_((Net_EtherAddress *etherAddress));
  225. extern    void    Mach_ContextSwitch _ARGS_((Proc_ControlBlock *fromProcPtr, Proc_ControlBlock *toProcPtr));
  226. extern    int    Mach_TestAndSet _ARGS_((int *intPtr));
  227. extern    int    Mach_GetMachineType _ARGS_((void));
  228. extern int Mach_GetMachineArch _ARGS_((void));
  229. extern void Mach_FlushWindowsToStack _ARGS_((void));
  230. extern    Address    Mach_GetStackPointer _ARGS_((void));
  231. extern void Mach_CheckSpecialHandling _ARGS_((int pnum));
  232. extern void Mach_Return2 _ARGS_((int val));
  233. extern int Mach_SigreturnStub _ARGS_((jmp_buf *jmpBuf));
  234.  
  235.  
  236. /*
  237.  * spriteStart is defined in bootSys.s with an underscore.
  238.  */
  239. extern    int        spriteStart;
  240. extern    int        endBss;
  241. extern    int        endText;
  242.  
  243. /*
  244.  * Machine dependent variables.
  245.  */
  246. extern    Address    mach_KernStart;
  247. extern    Address    mach_CodeStart;
  248. extern    Address    mach_StackBottom;
  249. extern    int    mach_KernStackSize;
  250. extern    Address    mach_KernEnd;
  251. extern    Address    mach_FirstUserAddr;
  252. extern    Address    mach_LastUserAddr;
  253. extern    Address    mach_MaxUserStackAddr;
  254. extern    int    mach_LastUserStackPage;
  255. extern    Mach_State  *machCurStatePtr;
  256.  
  257. /*
  258.  * New fast boot stuff.
  259.  */
  260. extern    int    storedDataSize;
  261. extern    char    storedData[];
  262. extern    char    *mach_RestartTablePtr;
  263. extern    ReturnStatus    Mach_FastBoot _ARGS_((void));
  264. extern    int    Mach_GetRestartTableSize _ARGS_((void));
  265.  
  266. #endif /* _MACH */
  267.